package org.binglan.youziyuepai.utils;


import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;

/**
 * @description:
 * @author: sanjin
 * @date: 2019/4/7 20:02
 */
public class UploadUtils {

    public static class Image {
        // 文件后缀名
        public String fileExtName;
        // 文件大小
        public long size;
        // 文件 InputStream
        public InputStream is;

        public Image(String fileExtName, long size, InputStream is) {
            this.fileExtName = fileExtName;
            this.size = size;
            this.is = is;
        }
    }

    // 合法图片后缀名
    private static final String[] IMAGE_EXT_NAME = {"JPG", "JPEG", "PNG", "GIF", "BMP", "WBMP"};

    // 最小文件大小 10Kb（bytes）
    private static final long MIN_FILE_SIZE = 10240;

    /**
     * 校验合法图片后缀名
     *
     * @param fileExtName
     * @return
     */
    public static boolean isImageExtNameValid(String fileExtName) {
        for (String s :
                IMAGE_EXT_NAME) {
            if (s.equalsIgnoreCase(fileExtName))
                return true;
        }
        return false;
    }


    /**
     * 获取文件后缀名
     *
     * @param fileName
     * @return
     */
    private static String getFileExtName(String fileName) {
        if (StringUtils.isBlank(fileName)) {
            return null;
        }
        String[] split = fileName.split("\\.");
        if (split.length < 1) {
            return null;
        }
        return split[split.length - 1];
    }


    /**
     * 校验文件列表，如果后缀名都合法，返回
     * Map<文件后缀名, 文件InputStream>,
     * 如果其中有一个不合法，返回 null
     */
    public static List<Image> checkMultipartImageFiles(MultipartFile[] files) {
        List<Image> list = new LinkedList<>();
        for (MultipartFile m :
                files) {
            long size = m.getSize();
            String fileExtName = getFileExtName(m.getOriginalFilename());
            // 判断图片合法值，最小大小是否合法
            if ((fileExtName == null && !isImageExtNameValid(fileExtName))
                    || size < MIN_FILE_SIZE) return null;
            try {
                list.add(new Image(fileExtName,size,m.getInputStream()));
            } catch (IOException e) {
                return null;
            }
        }
        return list;
    }
}
